今天是第二十四天我們可以寫一個k8s奧運資料庫管理系統,以下是我的程式碼
以下是基本的資料庫設計,包含幾個與奧運會相關的資料表:
CREATE DATABASE olympics;
USE olympics;
CREATE TABLE athletes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    country VARCHAR(100) NOT NULL,
    sport VARCHAR(100) NOT NULL,
    age INT NOT NULL,
    medals INT DEFAULT 0
);
CREATE TABLE events (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    year INT NOT NULL,
    location VARCHAR(100) NOT NULL
);
CREATE TABLE results (
    id INT AUTO_INCREMENT PRIMARY KEY,
    athlete_id INT,
    event_id INT,
    result VARCHAR(100) NOT NULL,
    FOREIGN KEY (athlete_id) REFERENCES athletes(id),
    FOREIGN KEY (event_id) REFERENCES events(id)
);
以下是一個簡單的 Python Flask API,用於管理資料庫中的奧運資料。這個 API 可以被容器化,並在 K8s 中部署。
from flask import Flask, request, jsonify
import mysql.connector
app = Flask(__name__)
# 連接 MySQL 資料庫
def get_db_connection():
    conn = mysql.connector.connect(
        host='mysql',
        user='root',
        password='password',
        database='olympics'
    )
    return conn
# 查詢運動員
@app.route('/athletes', methods=['GET'])
def get_athletes():
    conn = get_db_connection()
    cursor = conn.cursor(dictionary=True)
    cursor.execute('SELECT * FROM athletes')
    athletes = cursor.fetchall()
    cursor.close()
    conn.close()
    return jsonify(athletes)
# 新增運動員
@app.route('/athletes', methods=['POST'])
def add_athlete():
    new_athlete = request.get_json()
    conn = get_db_connection()
    cursor = conn.cursor()
    cursor.execute(
        'INSERT INTO athletes (name, country, sport, age) VALUES (%s, %s, %s, %s)',
        (new_athlete['name'], new_athlete['country'], new_athlete['sport'], new_athlete['age'])
    )
    conn.commit()
    cursor.close()
    conn.close()
    return 'Athlete added!', 201
# 查詢比賽事件
@app.route('/events', methods=['GET'])
def get_events():
    conn = get_db_connection()
    cursor = conn.cursor(dictionary=True)
    cursor.execute('SELECT * FROM events')
    events = cursor.fetchall()
    cursor.close()
    conn.close()
    return jsonify(events)
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
將 Flask 應用程式與 MySQL 容器化。這是 Flask API 的 Dockerfile:
dockerfile
# 使用 Python 3.9 映像
FROM python:3.9-slim
# 設定工作目錄
WORKDIR /app
# 複製需要的檔案
COPY requirements.txt requirements.txt
COPY app.py app.py
# 安裝必要套件
RUN pip install -r requirements.txt
# 暴露 Flask 的埠號
EXPOSE 5000
# 執行 Flask 應用程式
CMD ["python", "app.py"]
對應的 requirements.txt:
Flask==2.0.2
mysql-connector-python==8.0.26
以下是用於 K8s 的 mysql 和 flask 的部署與服務定義檔案。
MySQL 部署與服務 (mysql-deployment.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        - name: MYSQL_DATABASE
          value: olympics
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
Flask 部署與服務 (flask-deployment.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask
spec:
  selector:
    matchLabels:
      app: flask
  replicas: 1
  template:
    metadata:
      labels:
        app: flask
    spec:
      containers:
      - name: flask
        image: your-flask-image
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: flask
spec:
  type: LoadBalancer
  ports:
    - port: 5000
      targetPort: 5000
  selector:
    app: flask
確保 Kubernetes 環境已經配置好,並且你有 kubectl 訪問權限。接著執行以下命令將系統部署到 Kubernetes:
kubectl apply -f mysql-deployment.yaml
kubectl apply -f flask-deployment.yaml
系統成功部署後,使用 kubectl get svc 獲取 Flask 服務的外部 IP,然後可以透過該 IP 和端口測試 API。
範例:
curl http://<FLASK_SERVICE_IP>:5000/athletes
這樣就能取得所有運動員的數據,並可通過 POST 請求新增運動員。
CREATE DATABASE olympics;
USE olympics;
CREATE TABLE athletes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    country VARCHAR(100) NOT NULL,
    sport VARCHAR(100) NOT NULL,
    age INT NOT NULL,
    medals INT DEFAULT 0
);
CREATE TABLE events (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    year INT NOT NULL,
    location VARCHAR(100) NOT NULL
);
CREATE TABLE results (
    id INT AUTO_INCREMENT PRIMARY KEY,
    athlete_id INT,
    event_id INT,
    result VARCHAR(100) NOT NULL,
    FOREIGN KEY (athlete_id) REFERENCES athletes(id),
    FOREIGN KEY (event_id) REFERENCES events(id)
);
athletes: 儲存運動員的資訊,包括他們的姓名 (name)、國家 (country)、運動項目 (sport)、年齡 (age) 以及贏得的獎牌數量 (medals)。
id: 每個運動員的唯一識別碼,透過 AUTO_INCREMENT 自動生成。events: 儲存奧運會中的比賽事件,如比賽名稱 (name)、年份 (year) 和舉辦地點 (location)。
results: 記錄運動員參與比賽的結果,儲存運動員 ID (athlete_id)、比賽 ID (event_id) 和結果 (result)。
athlete_id 和 event_id 都是外鍵,分別參照 athletes 和 events 表中的 id。from flask import Flask, request, jsonify
import mysql.connector
app = Flask(__name__)
# 連接 MySQL 資料庫
def get_db_connection():
    conn = mysql.connector.connect(
        host='mysql',
        user='root',
        password='password',
        database='olympics'
    )
    return conn
Flask 是一個輕量級的 Python Web 框架,用於構建 Web 應用程式。在這裡,我們使用 Flask 構建一個 REST API 來操作奧運資料庫。mysql.connector.connect() 函數建立與 MySQL 資料庫的連接,連接參數包括 MySQL 容器的主機 (host),使用者 (user),密碼 (password) 以及資料庫名稱 (database)。# 查詢運動員
@app.route('/athletes', methods=['GET'])
def get_athletes():
    conn = get_db_connection()
    cursor = conn.cursor(dictionary=True)
    cursor.execute('SELECT * FROM athletes')
    athletes = cursor.fetchall()
    cursor.close()
    conn.close()
    return jsonify(athletes)
GET 請求處理 /athletes 路徑,用來查詢所有運動員。當有人發送請求到這個路徑時:
get_db_connection() 連接資料庫。'SELECT * FROM athletes' 取得所有運動員的資料。jsonify() 轉換結果為 JSON 格式,返回給客戶端。# 新增運動員
@app.route('/athletes', methods=['POST'])
def add_athlete():
    new_athlete = request.get_json()
    conn = get_db_connection()
    cursor = conn.cursor()
    cursor.execute(
        'INSERT INTO athletes (name, country, sport, age) VALUES (%s, %s, %s, %s)',
        (new_athlete['name'], new_athlete['country'], new_athlete['sport'], new_athlete['age'])
    )
    conn.commit()
    cursor.close()
    conn.close()
    return 'Athlete added!', 201
POST 請求,用於將新的運動員資料插入資料庫。
request.get_json() 取得請求的 JSON 資料(即運動員的資料)。INSERT INTO 語句將新運動員資料插入 athletes 資料表。conn.commit() 確認並保存變更,返回 201 狀態碼(表示資料成功創建)。# 查詢比賽事件
@app.route('/events', methods=['GET'])
def get_events():
    conn = get_db_connection()
    cursor = conn.cursor(dictionary=True)
    cursor.execute('SELECT * FROM events')
    events = cursor.fetchall()
    cursor.close()
    conn.close()
    return jsonify(events)
GET 路由,用於查詢 events 表中的比賽事件資料。與 get_athletes() 類似,這個函數連接資料庫,執行 SQL 查詢並返回結果。if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
app.run() 用於啟動 Flask 應用,並將其綁定到 0.0.0.0 地址(即允許所有外部 IP 訪問),在 5000 埠上運行。dockerfile
# 使用 Python 3.9 映像
FROM python:3.9-slim
# 設定工作目錄
WORKDIR /app
# 複製需要的檔案
COPY requirements.txt requirements.txt
COPY app.py app.py
# 安裝必要套件
RUN pip install -r requirements.txt
# 暴露 Flask 的埠號
EXPOSE 5000
# 執行 Flask 應用程式
CMD ["python", "app.py"]
FROM python:3.9-slim:使用 Python 3.9 的輕量版本作為基礎映像。WORKDIR /app:設定工作目錄為 /app,所有後續操作都會在此目錄下執行。COPY requirements.txt app.py:將 Flask 應用程式的依賴 (requirements.txt) 和應用程式主檔 (app.py) 複製到容器中。RUN pip install -r requirements.txt:安裝應用程式的依賴套件。EXPOSE 5000:暴露 Flask 應用使用的 5000 埠。CMD ["python", "app.py"]:運行 Flask 應用程式。mysql-deployment.yaml)apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        - name: MYSQL_DATABASE
          value: olympics
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
Deployment 用來在 Kubernetes 中部署 MySQL 資料庫。
replicas 設為 1,表示只需啟動一個 MySQL Pod。env 參數設置了 MySQL 的根密碼以及要創建的資料庫 (olympics)。Service 部分則暴露 MySQL 的 3306 埠號,允許其他應用訪問 MySQL。flask-deployment.yaml)apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask
spec:
  selector:
    matchLabels:
      app: flask
  replicas: 1
  template:
    metadata:
      labels:
        app: flask
   
 spec:
      containers:
      - name: flask
        image: flask-app:latest
        ports:
        - containerPort: 5000
        env:
        - name: FLASK_ENV
          value: production
---
apiVersion: v1
kind: Service
metadata:
  name: flask
spec:
  ports:
    - port: 5000
  selector:
    app: flask
Deployment 用於在 Kubernetes 中部署 Flask 應用程式。
Service 暴露 5000 埠。